package com.jxdinfo.hussar.example.common.schedulingtask;

import com.jxdinfo.hussar.example.common.schedulingtask.dao.MoMoMapper;
import com.jxdinfo.hussar.example.common.schedulingtask.model.MesProductOrderInfo;
import com.jxdinfo.hussar.example.common.schedulingtask.model.MoMo;
import com.jxdinfo.hussar.example.common.schedulingtask.service.MesProductOrderInfoService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * @Author QiaoBin
 * @Date 2024/3/21 17:47
 * @Description 生产订单表的的定时任务-mes_product_order_info
 */
@Component
@Deprecated
@AllArgsConstructor
public class ProductOrderInfoScheduleTask {
    private static final Logger logger = LoggerFactory.getLogger(ProductOrderInfoScheduleTask.class);

    private MoMoMapper moMoMapper;

    private MesProductOrderInfoService mesProductOrderInfoService;


    /**
     * @Author QiaoBin
     * @Date 2024/3/20 16:07
     * @Description 生产订单信息表的定时任务
     */
//    @Scheduled(cron = "*/5 * * * * ?")
    public void productInfoTask() {
        LocalDateTime nowTime = LocalDateTime.now();
        logger.info("\n生产订单信息表-定时任务-开始执行，当前时间nowTime={}", nowTime);
        synchronized ("productInfoTask") {
            logger.info("\n用友-erp订单-开始查询mes_product_order_info表中最大的定时任务时间");
            LocalDateTime scheduleDate = moMoMapper.selectMaxScheduleDate();
            logger.info("\n用友-erp订单-结束查询mes_product_order_info表中最大的定时任务时间，scheduleDate={}", scheduleDate);
            String scheduleDateString = "";
            if (scheduleDate != null) {
                scheduleDateString = scheduleDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
            // 查询momo中创建时间大于定时任务时间，查询出来后把所有数据全部插进去
            logger.info("\n用友-erp订单-开始查询用友mo_mo中创建时间大于任务时间，参数scheduleDateString={}", scheduleDateString);
            List<MoMo> moMoMoreScheduleList = moMoMapper.selectCreateMoreData(scheduleDateString);
            logger.info("\n用友-erp订单-结束查询用友mo_mo中创建时间大于任务时间,查询结果moMoMoreScheduleList={},数量size={}", moMoMoreScheduleList, moMoMoreScheduleList.size());
            if (moMoMoreScheduleList.size() > 0) {
                ArrayList<MesProductOrderInfo> mesProductOrderInfosList = new ArrayList<>();
                for (int i = 0; i < moMoMoreScheduleList.size(); i++) {
                    logger.info("\n用友-erp订单-当前循环次数i={}", i);
                    MoMo moMo = moMoMoreScheduleList.get(i);
                    MesProductOrderInfo mesProductOrderInfo = new MesProductOrderInfo();
                    mesProductOrderInfo.setProductNo(moMo.getProductNo());  // 生产单号
                    mesProductOrderInfo.setProductWorkshop(moMo.getProductWorkshop() + ""); // 生产车间
                    mesProductOrderInfo.setProductCode(moMo.getProductCode()); // 产品编码
                    mesProductOrderInfo.setProductName(moMo.getProductName()); // 产品名称
                    mesProductOrderInfo.setSpecification(moMo.getSpecification() + ""); // 规格型号
                    mesProductOrderInfo.setUnit(moMo.getUnit() + ""); // 单位
                    mesProductOrderInfo.setPlanNum(moMo.getPlanNum() + ""); // 计划数量
                    mesProductOrderInfo.setMomoId(moMo.getMomoId());
                    mesProductOrderInfo.setScheduleTime(nowTime);
                    mesProductOrderInfo.setCreateBy(moMo.getCreatedBy());
                    mesProductOrderInfo.setCreateTime(moMo.getCreatedOn());
                    mesProductOrderInfo.setUpdateBy(moMo.getModifiedBy());
                    mesProductOrderInfo.setUpdateTime(moMo.getModifiedOn());
                    logger.info("\n用友-erp订单-当前循环次数i={}，待保存的生产订单信息mesProductOrderInfo={}", i, mesProductOrderInfo);
                    mesProductOrderInfosList.add(mesProductOrderInfo);
                }
                logger.info("\n用友-erp订单-开始插入mes_product_order_info表数据,mesProductOrderInfosList={}", mesProductOrderInfosList);
                boolean c = mesProductOrderInfoService.saveBatch(mesProductOrderInfosList,200);
                logger.info("\n用友-erp订单-结束插入mes_product_order_info表数据,插入结果c={}", c);
            }
            if (scheduleDate == null) {
                logger.info("\n用友-erp订单-说明一次也没有同步，之间原封不动的插入就行,也就不需要后续的更新");
                return;
            }
            if (scheduleDate != null) {
                //查询momo中更新时间大于定时任务时间，查询出来后把所有数据全部更新进去
                logger.info("\n用友-erp订单-开始查询用友mo_mo中更新时间大于任务时间，参数scheduleDateString={}", scheduleDateString);
                List<MoMo> moMoUpdateMoreScheduleList = moMoMapper.selectUpdateMoreSchedule(scheduleDateString);
                logger.info("\n用友-erp订单-结束查询用友mo_mo中更新时间大于任务时间,查询结果moMoUpdateMoreScheduleList={},数量size={}", moMoUpdateMoreScheduleList, moMoUpdateMoreScheduleList.size());

                if (moMoUpdateMoreScheduleList == null || moMoUpdateMoreScheduleList.size() == 0) {
                    logger.info("\n用友-erp订单-没有查询到更新时间大于任务时间的mo_mo数据，程序终止");
                    return;
                }
                // moMoUpdateMoreScheduleList转成map集合
                logger.info("用友-erp订单-开始把更新时间大于任务时间的用友mo_mo数据转换成主键、对象的map集合");
                Map<Long, MoMo> moMoUpdateMap = moMoUpdateMoreScheduleList.stream().collect(Collectors.toMap(MoMo::getMomoId, t -> t));
                // 获取momo中更新过的主键
                logger.info("用友-erp订单-开始抽取更新时间大于任务时间的用友mo_mo数据中的主键");
                List<Long> moMoIdList = moMoUpdateMoreScheduleList.stream().map(MoMo::getMomoId).collect(Collectors.toList());
                // 根据momo的主键去order和orderline表中查询数据momo_id=主键的记录，重新设置值并更新进去
                logger.info("\n用友-erp订单-开始根据用友中的主键集合查询mes_product_order_info表中的数据，主键集合moMoIdList={}", moMoIdList);
                List<MesProductOrderInfo> tProductOrderUpdateList = moMoMapper.selectUpdateMoreScheduleOrder(moMoIdList);
                logger.info("\n用友-erp订单-结束根据用友中的主键集合查询mes_product_order_info表中的数据,结果tProductOrderUpdateList={}", tProductOrderUpdateList);
                if (tProductOrderUpdateList.size() > 0) {
                    ArrayList<MesProductOrderInfo> updateUrderList = new ArrayList<>();
                    for (int i = 0; i < tProductOrderUpdateList.size(); i++) {
                        logger.info("\n用友-erp订单-当前更新时间大于任务时间，mes_product_order_info表更新，次数i={}", i);
                        MesProductOrderInfo mesProductOrderInfo = tProductOrderUpdateList.get(i);
                        Long momoId = mesProductOrderInfo.getMomoId();
                        MoMo moMo = moMoUpdateMap.get(momoId);
                        mesProductOrderInfo.setProductNo(moMo.getProductNo());
                        mesProductOrderInfo.setProductWorkshop(moMo.getProductWorkshop());
                        mesProductOrderInfo.setProductCode(moMo.getProductCode());
                        mesProductOrderInfo.setProductName(moMo.getProductName());
                        mesProductOrderInfo.setSpecification(moMo.getSpecification());
                        mesProductOrderInfo.setUnit(moMo.getUnit());
                        mesProductOrderInfo.setPlanNum(moMo.getPlanNum());
                        mesProductOrderInfo.setCreateBy(moMo.getCreatedBy());
                        mesProductOrderInfo.setCreateTime(moMo.getCreatedOn());
                        mesProductOrderInfo.setScheduleTime(nowTime);
                        mesProductOrderInfo.setUpdateBy(moMo.getModifiedBy());
                        mesProductOrderInfo.setUpdateTime(moMo.getModifiedOn());
                        updateUrderList.add(mesProductOrderInfo);
                    }
                    logger.info("\n用友-erp订单-开始更新mes_product_order_info数据,列表updateUrderList={}", updateUrderList);
                    boolean u = mesProductOrderInfoService.updateBatchById(updateUrderList);
                    logger.info("\n用友-erp订单-结束更新mes_product_order_info数据,更新结果u={}", u);
                }
            }
            logger.info("\n用友-erp订单-定时任务结束执行，时间nowTime={}", LocalDateTime.now());
        }
        logger.info("\n生产订单信息表-定时任务-结束执行");
    }
}
